package niuke.week02;

import java.util.HashSet;
import java.util.Scanner;

/**
 给定一个有序数组arr，和一个整数aim，请不重复打印arr中所有累加和为aim的二元组。
 给定一个有序数组arr，和一个整数aim，请不重复打印arr中所有累加和为aim的三元组。

 9 6
 1 1 1 2 2 2 3 3 3

 按字典序输出所有和为aim的二元组
 按字典序输出所有和为aim的三元组
 每个组中数据从小到大排列
 数据完全相同的不输出

 3 3
 1 2 3
 2 2 2

 */
public class GetTupeOfSum {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int target = sc.nextInt();
        int []arr = new int[n];
        for(int i = 0; i< n; i++)
            arr[i] = sc.nextInt();


        int i=0,j=n-1;
        while(j>i){
            int cur = arr[i]+arr[j];
            if( cur== target){
                if(i-1>=0 && arr[i] == arr[i-1]) {//判断是否使用过arr[i]
                    i++;
                    continue;
                }
                System.out.println(arr[i] + " " + arr[j]);
                i++;
            }else if(cur>target){
                j--;
            }else {
                i++;
            }
        }

        HashSet<Integer> kSet = new HashSet<>();

        for (int k = 0; k < n-3; k++) {
//            System.out.println("-------------------"+k);
            if(kSet.contains(arr[k]))//是否用过a_K
                continue;

            int curTarget = target-arr[k];
            i=k+1;j=n-1;
            while(j>i){
                int cur = arr[i]+arr[j];
                if( cur== curTarget){
//                    System.out.println("i:"+i+ " j:" + j);
                    if(i-1>k && arr[i] == arr[i-1]) {//判断是否用过a_i,a_j这里按个数
                        i++;
                        continue;
                    }
                    System.out.println(arr[k]+" "+arr[i] + " " + arr[j]);
                    kSet.add(arr[k]);
                    i++;
                }else if(cur>curTarget){
                    j--;
                }else {
                    i++;
                }
            }
        }
    }
}